package com.bingbing.back.controller;

import com.bingbing.back.dto.CaListChangeDto;
import com.bingbing.back.dto.CaListDto;
import com.bingbing.back.po.CaList;
import com.bingbing.back.service.CaListService;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@CrossOrigin
@RestController
@RequestMapping("/calist")
public class CaListController {
    @Resource
    private CaListService caListService;

    @RequestMapping("/add")
    int AddItem(CaListDto dto){
        int row = 0;
        row = caListService.AddItem(dto);

        return row;
    }

    @RequestMapping("/show")
    List<CaList> showAll(CaListDto dto){
        List<CaList>  table = null;
        List<CaList> table1 = new ArrayList<>();

        table = caListService.showAll(dto);

        int cnt = 0;
        int max = table.size();
        for(int i = 1;i <= 96;i++)
        {
            if(max!=cnt)
            {
                if(i==table.get(cnt).getCaIndex())
                {
                    table1.add(table.get(cnt));
                    cnt++;
                }
                else{
                    CaList tem = new CaList();
                    tem.setCaIndex(i);
                    tem.setCaUser(dto.getCaUser());
                    table1.add(tem);
                }
            }
            else{
                CaList tem = new CaList();
                tem.setCaIndex(i);
                tem.setCaUser(dto.getCaUser());
                table1.add(tem);
            }
        }

        return table1;
    }

    /*
        state = 1  ---- 执行成功
        state = 0  ---- 未知操作错误
        state = -1 ---- 未定义操作命令
        state = -2 ---- 当前已经是置顶条目
        state = -3 ---- 上移出现错误
        state = -4 ---- 当前已经是末尾条目
        state = -5 ---- 下移出现错误
        state = -6 ---- 交换出现错误
        state = -7 ---- 删除出现错误
        state = -8 ---- 交换对象出现空值
     */
    @RequestMapping("/op")
    int op(CaListDto dto){
        init(dto);
        int maxIndex = 1000;
        int state = 0;

        int op = dto.getOp();
        if(op==0){
            return -1;
        }
        //上移
        else if(op==1){
            if(dto.getCaIndex()==1)
            {
                return -2;
            }
            else
            {
                CaListDto caList = new CaListDto();
                caList.setCaUser(dto.getCaUser());
                caList.setCaIndex(dto.getCaIndex()-1);

                if(null==caListService.isExist(caList)) {
                    CaListChangeDto caListChangeDto = new CaListChangeDto();
                    caListChangeDto.setCaUser(dto.getCaUser());
                    caListChangeDto.setIndex1(dto.getCaIndex());
                    caListChangeDto.setIndex2(dto.getCaIndex()-1);
                    int row = caListService.changeIndex(caListChangeDto);
                    if(row==0) return -3;
                }else{
                    CaListChangeDto caListChangeDto = new CaListChangeDto();
                    caListChangeDto.setCaUser(dto.getCaUser());
                    caListChangeDto.setIndex1(dto.getCaIndex() - 1);
                    caListChangeDto.setIndex2(maxIndex);
                    int row = caListService.changeIndex(caListChangeDto);
                    if (row == 0) return -3;
                    caListChangeDto.setIndex1(dto.getCaIndex());
                    caListChangeDto.setIndex2(dto.getCaIndex() - 1);
                    row = caListService.changeIndex(caListChangeDto);
                    if (row == 0) return -3;
                    caListChangeDto.setIndex1(maxIndex);
                    caListChangeDto.setIndex2(dto.getCaIndex());
                    row = caListService.changeIndex(caListChangeDto);
                    if (row == 0) return -3;
                }
            }
            return 1;
        }
        //下移
        else if(op==2){
//            int sum = caListService.getSumItem(dto);
            int sum = 96;
            if(dto.getCaIndex()==sum){
                return -4;
            }
            else
            {
                CaListDto caList = new CaListDto();
                caList.setCaUser(dto.getCaUser());
                caList.setCaIndex(dto.getCaIndex()+1);

                if(null==caListService.isExist(caList)) {
                    CaListChangeDto caListChangeDto = new CaListChangeDto();
                    caListChangeDto.setCaUser(dto.getCaUser());
                    caListChangeDto.setIndex1(dto.getCaIndex());
                    caListChangeDto.setIndex2(dto.getCaIndex()+1);
                    int row = caListService.changeIndex(caListChangeDto);
                    if(row==0) return -5;
                }else {
                    CaListChangeDto caListChangeDto = new CaListChangeDto();
                    caListChangeDto.setCaUser(dto.getCaUser());
                    caListChangeDto.setIndex1(dto.getCaIndex() + 1);
                    caListChangeDto.setIndex2(maxIndex);
                    int row = caListService.changeIndex(caListChangeDto);
                    if (row == 0) return -5;
                    caListChangeDto.setIndex1(dto.getCaIndex());
                    caListChangeDto.setIndex2(dto.getCaIndex() + 1);
                    row = caListService.changeIndex(caListChangeDto);
                    if (row == 0) return -5;
                    caListChangeDto.setIndex1(maxIndex);
                    caListChangeDto.setIndex2(dto.getCaIndex());
                    row = caListService.changeIndex(caListChangeDto);
                    if (row == 0) return -5;
                }
            }
            return 1;
        }
        //交换
        else if(op==3){
            CaListDto caList = new CaListDto();
            caList.setCaUser(dto.getCaUser());
            caList.setCaIndex(dto.getCaIndex());
            CaListDto caList1 = new CaListDto();
            caList1.setCaUser(dto.getCaUser());
            caList1.setCaIndex(dto.getCaIndex1());

            if(null==caListService.isExist(caList) && null==caListService.isExist(caList1)) {
               return -8;
            }else if(null==caListService.isExist(caList)){
                CaListChangeDto caListChangeDto = new CaListChangeDto();
                caListChangeDto.setCaUser(dto.getCaUser());
                caListChangeDto.setIndex1(dto.getCaIndex1());
                caListChangeDto.setIndex2(dto.getCaIndex());
                int row = caListService.changeIndex(caListChangeDto);
                if(row==0) return -6;
            }else if(null==caListService.isExist(caList1)){
                CaListChangeDto caListChangeDto = new CaListChangeDto();
                caListChangeDto.setCaUser(dto.getCaUser());
                caListChangeDto.setIndex1(dto.getCaIndex());
                caListChangeDto.setIndex2(dto.getCaIndex1());
                int row = caListService.changeIndex(caListChangeDto);
                if(row==0) return -6;
            } else {
                CaListChangeDto caListChangeDto = new CaListChangeDto();
                caListChangeDto.setCaUser(dto.getCaUser());
                caListChangeDto.setIndex1(dto.getCaIndex1());
                caListChangeDto.setIndex2(maxIndex);
                int row = caListService.changeIndex(caListChangeDto);
                if (row == 0) return -6;
                caListChangeDto.setIndex1(dto.getCaIndex());
                caListChangeDto.setIndex2(dto.getCaIndex1());
                row = caListService.changeIndex(caListChangeDto);
                if (row == 0) return -6;
                caListChangeDto.setIndex1(maxIndex);
                caListChangeDto.setIndex2(dto.getCaIndex());
                row = caListService.changeIndex(caListChangeDto);
                if (row == 0) return -6;

            }
            return 1;
        }
        else if(op==4)
        {
            if(caListService.delete(dto)==0){
                return -7;
            }
            return 1;
        }

        return state;
    }

    void init(CaListDto dto){
        CaListDto caListDto = new CaListDto();
        caListDto.setCaUser(dto.getCaUser());
        caListDto.setCaIndex(1000);
        if(null!=caListService.isExist(caListDto)){
            caListService.delete(caListDto);
        }
    }

}
